/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package construtora.limiar.dao;

import construtora.limiar.dao.generic.AbstractDAO;
import construtora.limiar.dao.generic.DAOEngine;
import construtora.limiar.dao.generic.IDAO;
import construtora.limiar.models.ClientePessoaFisica;
import construtora.limiar.models.ClientePessoaJuridica;
import construtora.limiar.models.Endereco;
import construtora.limiar.models.Usuario;
import construtora.limiar.models.generic.AbstractCliente;
import construtora.limiar.models.generic.IModel;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author michel
 */
public class ClienteDAO extends AbstractDAO implements IDAO {

    @Override
    public String[][] getFields(IModel model) {
        AbstractCliente cliente = (AbstractCliente) model;
        String[][] fields = new String[5][2];
        fields[0][0] = "id_endereco";
        fields[0][1] = "'" + cliente.getEndereco().getId().toString() + "'";
        fields[1][0] = "status";
        fields[1][1] = "'" + cliente.getStatus() + "'";
        fields[2][0] = "id_usuario";
        fields[2][1] = "'" + cliente.getUsuario().getId().toString() + "'";
        fields[3][0] = "tipo_telefone";
        fields[3][1] = "'" + cliente.getTipoTelefone() + "'";
        fields[4][0] = "numero_telefone";
        fields[4][1] = "'" + cliente.getTelefone() + "'";
        return fields;
    }

    @Override
    public IModel fetchOne(IModel model) {
        //String where = this.getDefaultWhere(model);
        String where = "id_cliente = " + model.getId();
        AbstractCliente cliente = new AbstractCliente() {
            @Override
            public String getIdentificacao() {
                //throw new UnsupportedOperationException("Not supported yet.");
                ClientePessoaFisicaDAO pfd = new ClientePessoaFisicaDAO();
                List list1 = pfd.fetchAll("id_cliente = '" + this.id + "'", null, null, null);
                if (!list1.isEmpty()) {
                    ClientePessoaFisica pf = (ClientePessoaFisica) list1.get(0);
                    return pf.getIdentificacao();
                } else {
                    ClientePessoaJuridicaDAO pjd = new ClientePessoaJuridicaDAO();
                    List list2 = pjd.fetchAll("id_cliente = '" + this.id + "'", null, null, null);
                    ClientePessoaJuridica pj = (ClientePessoaJuridica) list2.get(0);
                    return pj.getIdentificacao();
                }

            }

            @Override
            public void setIdentificacao(String identificacao) {
                throw new UnsupportedOperationException("Not supported yet.");
            }

            @Override
            public String getDocumento() {
                //throw new UnsupportedOperationException("Not supported yet.");
                ClientePessoaFisicaDAO pfd = new ClientePessoaFisicaDAO();
                List list1 = pfd.fetchAll("id_cliente = '" + this.id + "'", null, null, null);
                if (!list1.isEmpty()) {
                    ClientePessoaFisica pf = (ClientePessoaFisica) list1.get(0);
                    return pf.getDocumento();
                } else {
                    ClientePessoaJuridicaDAO pjd = new ClientePessoaJuridicaDAO();
                    List list2 = pjd.fetchAll("id_cliente = '" + this.id + "'", null, null, null);
                    ClientePessoaJuridica pj = (ClientePessoaJuridica) list2.get(0);
                    return pj.getDocumento();
                }
            }

            @Override
            public void setDocumento(String documento) {
                throw new UnsupportedOperationException("Not supported yet.");
            }
        };
        List<AbstractCliente> list = (List<AbstractCliente>) this.fetchAll(where, null, null, null);
        if (list != null && list.size() > 0) {
            cliente = list.get(0);
            return cliente;
        } else {
            return null;
        }
    }

    @Override
    public List<? extends IModel> fetchAll(String where, String order, Integer limit, Integer offset) {
        List<AbstractCliente> list = new ArrayList<AbstractCliente>();
        ResultSet rs = DAOEngine.fetchAll(this.table, where, order, limit, offset);
        try {
            while (rs.next()) {
                AbstractCliente cliente = new AbstractCliente() {
                    @Override
                    public String getIdentificacao() {
                        //throw new UnsupportedOperationException("Not supported yet.");
                        ClientePessoaFisicaDAO pfd = new ClientePessoaFisicaDAO();
                        List list1 = pfd.fetchAll("id_cliente = '" + this.id + "'", null, null, null);
                        if (!list1.isEmpty()) {
                            ClientePessoaFisica pf = (ClientePessoaFisica) list1.get(0);
                            return pf.getIdentificacao();
                        } else {
                            ClientePessoaJuridicaDAO pjd = new ClientePessoaJuridicaDAO();
                            List list2 = pjd.fetchAll("id_cliente = '" + this.id + "'", null, null, null);
                            ClientePessoaJuridica pj = (ClientePessoaJuridica) list2.get(0);
                            return pj.getIdentificacao();
                        }

                    }

                    @Override
                    public void setIdentificacao(String identificacao) {
                        throw new UnsupportedOperationException("Not supported yet.");
                    }

                    @Override
                    public String getDocumento() {
                        //throw new UnsupportedOperationException("Not supported yet.");
                        ClientePessoaFisicaDAO pfd = new ClientePessoaFisicaDAO();
                        List list1 = pfd.fetchAll("id_cliente = '" + this.id + "'", null, null, null);
                        if (!list1.isEmpty()) {
                            ClientePessoaFisica pf = (ClientePessoaFisica) list1.get(0);
                            return pf.getDocumento();
                        } else {
                            ClientePessoaJuridicaDAO pjd = new ClientePessoaJuridicaDAO();
                            List list2 = pjd.fetchAll("id_cliente = '" + this.id + "'", null, null, null);
                            ClientePessoaJuridica pj = (ClientePessoaJuridica) list2.get(0);
                            return pj.getDocumento();
                        }
                    }

                    @Override
                    public void setDocumento(String documento) {
                        throw new UnsupportedOperationException("Not supported yet.");
                    }
                };
                EnderecoDAO endDAO = new EnderecoDAO();
                UsuarioDAO usuDAO = new UsuarioDAO();
                cliente.setId(rs.getInt("id_cliente"));
                cliente.setStatus(rs.getString("status"));
                cliente.setTipoTelefone(rs.getString("tipo_telefone"));
                cliente.setTelefone(rs.getString("numero_telefone"));
                cliente.setEndereco((Endereco) endDAO.fetchOne(new Endereco(rs.getInt("id_endereco"))));
                cliente.setUsuario((Usuario) usuDAO.fetchOne(new Usuario(rs.getInt("id_usuario"))));
                list.add(cliente);
            }
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public ClienteDAO() {
        this.table = "cliente";
    }
}
